/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
var maxSlidingWindow = function(nums, k) {
    let res=[]
    let n=nums.length
    let queue=[] //维护一个从左到右单调递减的队列
    for(let i=0;i<n;i++){
        //1.元素进入滑动窗口
        while(queue.length>0 && nums[queue[queue.length-1]]<=nums[i]){ //如果队列为空或者找到的元素不小于队尾元素
            //先去除掉在这个窗口中不可能为最大值的，因为队列中的元素一定会先于没入队的元素离开，只有比下一个元素大的元素才有可能成为最大元素
            queue.pop()
        }
        //每一次循环窗口滑动一次
        queue.push(i) //记录下标，方便访问对应元素
        //2.有元素移出滑动窗口,i>=k的时候窗口才满，这时要移除,由于要移除的元素可能是最大值也就是队首,但是队首也可能已经被移出了
        // 如果到目前需要被移除的元素还没被移除，只能说明他是队首
        if(i-queue[0]>= k){
            queue.shift()
        }
        //3.记录最大值:长度为k时就要开始记录，也就是i==k-1的时候
        if(i>=k-1){
            res.push(nums[queue[0]])
        }

    }
    return res

};

let nums = [1,3,-1,-3,5,3,6,7]
let k = 3
console.log(maxSlidingWindow(nums,k));

